// src/util/request.js

import axios from 'axios'
import { message } from 'ant-design-vue'
import router from '@/router'
import { handleApiError } from '@/api/apiError'

// 创建axios实例
const request = axios.create({
  baseURL: '/api',
  timeout: 10000,
  withCredentials: true,
  headers: {
    'Content-Type': 'application/json;charset=UTF-8',
  },
})

// 请求拦截器
request.interceptors.request.use(
  (config) => {
    // 登录和登出接口不需要携带 token
    const isAuthRequest = config.url === '/auth/login' || config.url === '/auth/logout'

    if (!isAuthRequest) {
      const token = sessionStorage.getItem('token')
      if (token) {
        // 使用标准的 Headers 属性访问
        config.headers.Authorization = `Bearer ${token}`
      }
    }
    return config
  },
  (error) => {
    // 对请求错误做些什么
    return Promise.reject(error)
  },
)

// 响应拦截器 (保持不变，已实现解构)
request.interceptors.response.use(
  (response) => {
    console.log('请求成功:', {
      url: response.config.url,
      method: response.config.method,
      status: response.status,
      data: response.data,
    })

    if (typeof response.data === 'string' || typeof response.data === 'number') {
      return response.data
    }

    const res = response.data

    // 如果响应数据为空或不是对象，直接返回
    if (!res || typeof res !== 'object') {
      return res
    }

    // 如果没有 code 字段，说明不是标准响应格式，直接返回
    if (typeof res.code === 'undefined') {
      return res
    }

    // 如果 code 不为 0，说明请求失败
    if (res.code !== 0) {
      // 确保 message 是字符串
      let errorMessage = '请求失败'
      if (res.message) {
        if (typeof res.message === 'string') {
          errorMessage = res.message
        } else if (typeof res.message === 'object') {
          errorMessage = JSON.stringify(res.message)
        } else {
          errorMessage = String(res.message)
        }
      }
      const error = new Error(errorMessage)
      error.isApiError = true
      error.response = response
      return Promise.reject(error)
    }

    // 核心：返回 data 数据，如果 data 为 null 或 undefined，返回空对象或空数组
    return res.data !== undefined && res.data !== null ? res.data : {}
  },
  (error) => {
    console.error('请求失败:', {
      url: error.config?.url,
      method: error.config?.method,
      status: error.response?.status,
      statusText: error.response?.statusText,
      error: error.message,
    })

    if (error.response?.status === 401) {
      message.error('登录已过期，请重新登录')
      // 清除 token
      if (typeof window !== 'undefined' && window.sessionStorage) {
        sessionStorage.removeItem('token')
        sessionStorage.removeItem('userRole')
      }
      if (router) {
        router.push('/')
      }
    } else if (error.response?.data) {
      const res = error.response.data
      error.message = res?.message || res?.msg || error.message || '请求失败'
    }

    return Promise.reject(error)
  },
)

// 封装请求方法
const http = {
  // 基础请求方法 (修正了错误处理)
  async request(config) {
    try {
      const response = await request(config)
      return response
    } catch (error) {
      // 直接返回 handleApiError 的结果，它负责显示消息并返回 Promise.reject(error)
      if (typeof handleApiError === 'function') {
        return handleApiError(error)
      }
      // 如果 handleApiError 不存在，则直接拒绝
      return Promise.reject(error)
    }
  },

  get(url, params, config = {}) {
    return this.request({ ...config, method: 'GET', url, params })
  },

  post(url, data, config = {}) {
    return this.request({ ...config, method: 'POST', url, data })
  },

  put(url, data, config = {}) {
    return this.request({ ...config, method: 'PUT', url, data })
  },

  delete(url, params, config = {}) {
    return this.request({ ...config, method: 'DELETE', url, params })
  },

  upload(url, file, fieldName = 'file', config = {}) {
    const formData = new FormData()
    formData.append(fieldName, file)

    return this.request({
      ...config,
      method: 'POST',
      url,
      data: formData,
      headers: {
        'Content-Type': 'multipart/form-data',
        ...config.headers,
      },
    })
  },
}

export { http }
export default request
